#include<stdio.h>
#include<stdlib.h>
#include<string.h>


// @ 深拷贝 浅拷贝

struct Person{
    char name[64];
    int age;
};

void test1(){
    struct Person p = {"haha", 20};
    struct Person p2 = {"Jerry", 10};

    p = p2; // Jerry 10    逐字节拷贝

    printf("p的姓名: %s 年龄: %d\n", p.name,p.age);
    printf("p2的姓名: %s 年龄: %d\n", p2.name,p2.age);
}


struct Person2{
    char * name;
    int age ;
};

void test2(){
    struct Person2 p1;

    p1.name = malloc(sizeof(char)*64);
    strcpy(p1.name, "tom");
    p1.age = 20;

    struct Person2 p2;
    p2.name = malloc(sizeof(char)*64);
    strcpy(p2.name, "jerry");
    p2.age = 23;

    //p1 = p2;   // 堆上 ， 指针两次是否 ，错误    手动赋值 ，提供深拷贝

    //******** 手动赋值
    // 先释放原来的空间
    if(p1.name!=NULL){
        free(p1.name);
        p1.name = NULL;
    }
    // 在堆区创建一块空间
    p1.name = malloc(strlen(p2.name)+1);
    strcpy(p1.name, p2.name);
    p1.age = p2.age;
    //*************




    printf("p的姓名: %s 年龄: %d\n", p1.name,p1.age);
    printf("p2的姓名: %s 年龄: %d\n", p2.name,p2.age);

    if(p1.name!=NULL){
        free(p1.name);
        p1.name = NULL;
    }

    if(p2.name!=NULL){
        free(p2.name);
        p2.name = NULL;
    }

}

// 浅拷贝   

void main(){
    // test1();

    test2();
}